/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.jpa.controllers;

import co.com.ces4.produccion.jpa.controllers.exceptions.IllegalOrphanException;
import co.com.ces4.produccion.jpa.controllers.exceptions.NonexistentEntityException;
import co.com.ces4.produccion.jpa.controllers.exceptions.PreexistingEntityException;
import co.com.ces4.produccion.jpa.entities.DetalleSolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.DetalleSolicitudProduccionPK;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import co.com.ces4.produccion.jpa.entities.SolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.Articulo;
import co.com.ces4.produccion.jpa.entities.DetalleOrdenProduccion;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author usuario
 */
public class DetalleSolicitudProduccionJpaController implements Serializable {

    public DetalleSolicitudProduccionJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(DetalleSolicitudProduccion detalleSolicitudProduccion) throws PreexistingEntityException, Exception {
        if (detalleSolicitudProduccion.getDetalleSolicitudProduccionPK() == null) {
            detalleSolicitudProduccion.setDetalleSolicitudProduccionPK(new DetalleSolicitudProduccionPK());
        }
        if (detalleSolicitudProduccion.getDetalleOrdenProduccionList() == null) {
            detalleSolicitudProduccion.setDetalleOrdenProduccionList(new ArrayList<DetalleOrdenProduccion>());
        }
        detalleSolicitudProduccion.getDetalleSolicitudProduccionPK().setNmsolicitudProduccion(detalleSolicitudProduccion.getSolicitudProduccion().getNmid());
        detalleSolicitudProduccion.getDetalleSolicitudProduccionPK().setDsarticulo(detalleSolicitudProduccion.getArticulo().getDsid());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            SolicitudProduccion solicitudProduccion = detalleSolicitudProduccion.getSolicitudProduccion();
            if (solicitudProduccion != null) {
                solicitudProduccion = em.getReference(solicitudProduccion.getClass(), solicitudProduccion.getNmid());
                detalleSolicitudProduccion.setSolicitudProduccion(solicitudProduccion);
            }
            Articulo articulo = detalleSolicitudProduccion.getArticulo();
            if (articulo != null) {
                articulo = em.getReference(articulo.getClass(), articulo.getDsid());
                detalleSolicitudProduccion.setArticulo(articulo);
            }
            List<DetalleOrdenProduccion> attachedDetalleOrdenProduccionList = new ArrayList<DetalleOrdenProduccion>();
            for (DetalleOrdenProduccion detalleOrdenProduccionListDetalleOrdenProduccionToAttach : detalleSolicitudProduccion.getDetalleOrdenProduccionList()) {
                detalleOrdenProduccionListDetalleOrdenProduccionToAttach = em.getReference(detalleOrdenProduccionListDetalleOrdenProduccionToAttach.getClass(), detalleOrdenProduccionListDetalleOrdenProduccionToAttach.getDetalleOrdenProduccionPK());
                attachedDetalleOrdenProduccionList.add(detalleOrdenProduccionListDetalleOrdenProduccionToAttach);
            }
            detalleSolicitudProduccion.setDetalleOrdenProduccionList(attachedDetalleOrdenProduccionList);
            em.persist(detalleSolicitudProduccion);
            /*if (solicitudProduccion != null) {
                solicitudProduccion.getDetalleSolicitudProduccionList().add(detalleSolicitudProduccion);
                solicitudProduccion = em.merge(solicitudProduccion);
            }
            if (articulo != null) {
                articulo.getDetalleSolicitudProduccionList().add(detalleSolicitudProduccion);
                articulo = em.merge(articulo);
            }
            for (DetalleOrdenProduccion detalleOrdenProduccionListDetalleOrdenProduccion : detalleSolicitudProduccion.getDetalleOrdenProduccionList()) {
                DetalleSolicitudProduccion oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListDetalleOrdenProduccion = detalleOrdenProduccionListDetalleOrdenProduccion.getDetalleSolicitudProduccion();
                detalleOrdenProduccionListDetalleOrdenProduccion.setDetalleSolicitudProduccion(detalleSolicitudProduccion);
                detalleOrdenProduccionListDetalleOrdenProduccion = em.merge(detalleOrdenProduccionListDetalleOrdenProduccion);
                if (oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListDetalleOrdenProduccion != null) {
                    oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListDetalleOrdenProduccion.getDetalleOrdenProduccionList().remove(detalleOrdenProduccionListDetalleOrdenProduccion);
                    oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListDetalleOrdenProduccion = em.merge(oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListDetalleOrdenProduccion);
                }
            }*/
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findDetalleSolicitudProduccion(detalleSolicitudProduccion.getDetalleSolicitudProduccionPK()) != null) {
                throw new PreexistingEntityException("DetalleSolicitudProduccion " + detalleSolicitudProduccion + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(DetalleSolicitudProduccion detalleSolicitudProduccion) throws IllegalOrphanException, NonexistentEntityException, Exception {
        detalleSolicitudProduccion.getDetalleSolicitudProduccionPK().setNmsolicitudProduccion(detalleSolicitudProduccion.getSolicitudProduccion().getNmid());
        detalleSolicitudProduccion.getDetalleSolicitudProduccionPK().setDsarticulo(detalleSolicitudProduccion.getArticulo().getDsid());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleSolicitudProduccion persistentDetalleSolicitudProduccion = em.find(DetalleSolicitudProduccion.class, detalleSolicitudProduccion.getDetalleSolicitudProduccionPK());
            SolicitudProduccion solicitudProduccionOld = persistentDetalleSolicitudProduccion.getSolicitudProduccion();
            SolicitudProduccion solicitudProduccionNew = detalleSolicitudProduccion.getSolicitudProduccion();
            Articulo articuloOld = persistentDetalleSolicitudProduccion.getArticulo();
            Articulo articuloNew = detalleSolicitudProduccion.getArticulo();
            List<DetalleOrdenProduccion> detalleOrdenProduccionListOld = persistentDetalleSolicitudProduccion.getDetalleOrdenProduccionList();
            List<DetalleOrdenProduccion> detalleOrdenProduccionListNew = detalleSolicitudProduccion.getDetalleOrdenProduccionList();
            List<String> illegalOrphanMessages = null;
            for (DetalleOrdenProduccion detalleOrdenProduccionListOldDetalleOrdenProduccion : detalleOrdenProduccionListOld) {
                if (!detalleOrdenProduccionListNew.contains(detalleOrdenProduccionListOldDetalleOrdenProduccion)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain DetalleOrdenProduccion " + detalleOrdenProduccionListOldDetalleOrdenProduccion + " since its detalleSolicitudProduccion field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (solicitudProduccionNew != null) {
                solicitudProduccionNew = em.getReference(solicitudProduccionNew.getClass(), solicitudProduccionNew.getNmid());
                detalleSolicitudProduccion.setSolicitudProduccion(solicitudProduccionNew);
            }
            if (articuloNew != null) {
                articuloNew = em.getReference(articuloNew.getClass(), articuloNew.getDsid());
                detalleSolicitudProduccion.setArticulo(articuloNew);
            }
            List<DetalleOrdenProduccion> attachedDetalleOrdenProduccionListNew = new ArrayList<DetalleOrdenProduccion>();
            for (DetalleOrdenProduccion detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach : detalleOrdenProduccionListNew) {
                detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach = em.getReference(detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach.getClass(), detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach.getDetalleOrdenProduccionPK());
                attachedDetalleOrdenProduccionListNew.add(detalleOrdenProduccionListNewDetalleOrdenProduccionToAttach);
            }
            detalleOrdenProduccionListNew = attachedDetalleOrdenProduccionListNew;
            detalleSolicitudProduccion.setDetalleOrdenProduccionList(detalleOrdenProduccionListNew);
            detalleSolicitudProduccion = em.merge(detalleSolicitudProduccion);
            if (solicitudProduccionOld != null && !solicitudProduccionOld.equals(solicitudProduccionNew)) {
                solicitudProduccionOld.getDetalleSolicitudProduccionList().remove(detalleSolicitudProduccion);
                solicitudProduccionOld = em.merge(solicitudProduccionOld);
            }
            if (solicitudProduccionNew != null && !solicitudProduccionNew.equals(solicitudProduccionOld)) {
                solicitudProduccionNew.getDetalleSolicitudProduccionList().add(detalleSolicitudProduccion);
                solicitudProduccionNew = em.merge(solicitudProduccionNew);
            }
            if (articuloOld != null && !articuloOld.equals(articuloNew)) {
                articuloOld.getDetalleSolicitudProduccionList().remove(detalleSolicitudProduccion);
                articuloOld = em.merge(articuloOld);
            }
            if (articuloNew != null && !articuloNew.equals(articuloOld)) {
                articuloNew.getDetalleSolicitudProduccionList().add(detalleSolicitudProduccion);
                articuloNew = em.merge(articuloNew);
            }
            for (DetalleOrdenProduccion detalleOrdenProduccionListNewDetalleOrdenProduccion : detalleOrdenProduccionListNew) {
                if (!detalleOrdenProduccionListOld.contains(detalleOrdenProduccionListNewDetalleOrdenProduccion)) {
                    DetalleSolicitudProduccion oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListNewDetalleOrdenProduccion = detalleOrdenProduccionListNewDetalleOrdenProduccion.getDetalleSolicitudProduccion();
                    detalleOrdenProduccionListNewDetalleOrdenProduccion.setDetalleSolicitudProduccion(detalleSolicitudProduccion);
                    detalleOrdenProduccionListNewDetalleOrdenProduccion = em.merge(detalleOrdenProduccionListNewDetalleOrdenProduccion);
                    if (oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListNewDetalleOrdenProduccion != null && !oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListNewDetalleOrdenProduccion.equals(detalleSolicitudProduccion)) {
                        oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListNewDetalleOrdenProduccion.getDetalleOrdenProduccionList().remove(detalleOrdenProduccionListNewDetalleOrdenProduccion);
                        oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListNewDetalleOrdenProduccion = em.merge(oldDetalleSolicitudProduccionOfDetalleOrdenProduccionListNewDetalleOrdenProduccion);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                DetalleSolicitudProduccionPK id = detalleSolicitudProduccion.getDetalleSolicitudProduccionPK();
                if (findDetalleSolicitudProduccion(id) == null) {
                    throw new NonexistentEntityException("The detalleSolicitudProduccion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(DetalleSolicitudProduccionPK id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleSolicitudProduccion detalleSolicitudProduccion;
            try {
                detalleSolicitudProduccion = em.getReference(DetalleSolicitudProduccion.class, id);
                detalleSolicitudProduccion.getDetalleSolicitudProduccionPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The detalleSolicitudProduccion with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<DetalleOrdenProduccion> detalleOrdenProduccionListOrphanCheck = detalleSolicitudProduccion.getDetalleOrdenProduccionList();
            for (DetalleOrdenProduccion detalleOrdenProduccionListOrphanCheckDetalleOrdenProduccion : detalleOrdenProduccionListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This DetalleSolicitudProduccion (" + detalleSolicitudProduccion + ") cannot be destroyed since the DetalleOrdenProduccion " + detalleOrdenProduccionListOrphanCheckDetalleOrdenProduccion + " in its detalleOrdenProduccionList field has a non-nullable detalleSolicitudProduccion field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            SolicitudProduccion solicitudProduccion = detalleSolicitudProduccion.getSolicitudProduccion();
            if (solicitudProduccion != null) {
                solicitudProduccion.getDetalleSolicitudProduccionList().remove(detalleSolicitudProduccion);
                solicitudProduccion = em.merge(solicitudProduccion);
            }
            Articulo articulo = detalleSolicitudProduccion.getArticulo();
            if (articulo != null) {
                articulo.getDetalleSolicitudProduccionList().remove(detalleSolicitudProduccion);
                articulo = em.merge(articulo);
            }
            em.remove(detalleSolicitudProduccion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<DetalleSolicitudProduccion> findDetalleSolicitudProduccionEntities() {
        return findDetalleSolicitudProduccionEntities(true, -1, -1);
    }

    public List<DetalleSolicitudProduccion> findDetalleSolicitudProduccionEntities(int maxResults, int firstResult) {
        return findDetalleSolicitudProduccionEntities(false, maxResults, firstResult);
    }

    private List<DetalleSolicitudProduccion> findDetalleSolicitudProduccionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(DetalleSolicitudProduccion.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public DetalleSolicitudProduccion findDetalleSolicitudProduccion(DetalleSolicitudProduccionPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(DetalleSolicitudProduccion.class, id);
        } finally {
            em.close();
        }
    }

    public int getDetalleSolicitudProduccionCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<DetalleSolicitudProduccion> rt = cq.from(DetalleSolicitudProduccion.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
